package visao;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JSpinner;
import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.UIManager;

import modelo.Cliente;
import modelo.Evento;
import modelo.Funcionario;
import modelo.Ingresso;
import modelo.Venda;
import modelo.VendaIngresso;
import controle.ControleEvento;
import controle.ControleIngresso;
import controle.ControleVenda;
import controle.ControleVendaIngresso;

import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

import de.javasoft.plaf.synthetica.SyntheticaBlackEyeLookAndFeel;
import de.javasoft.plaf.synthetica.SyntheticaSimple2DLookAndFeel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
 * 
 * @author matheus
 */
public class VenderIngresso extends JFrame {

	private JPanel contentPane;
	// private JTextField txtCliente;
	private ControleEvento controleEvento = new ControleEvento();
	private ControleVendaIngresso controleVendaIngresso = new ControleVendaIngresso();
	private JComboBox cbbEvento;
	private JLabel lblEstadio;
	private JLabel lblData;
	private JLabel lblJogo;
	private JLabel lblPreco;
	private JLabel lblTotal;
	private JSpinner cbbQuantidade;
	private JComboBox cbbIngresso;
	private JLabel lblEstado;
	private Evento evento = new Evento();
	private Cliente cliente = new Cliente();
	private Funcionario funcionario = new Funcionario();
	private JLabel lblFuncionario;
	private JLabel lblCliente;
	private JLabel lblCadeiras;
	private int maximo;
	private double preco;
	private ControleIngresso controleIngresso = new ControleIngresso();
	private int status;
	private Menu menuTela = new Menu();

	/***
	 * Launch the application.
	 *Metodo abrir tela
         * @param args 
         */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					UIManager
							.setLookAndFeel(new SyntheticaSimple2DLookAndFeel());
					VenderIngresso frame = new VenderIngresso();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/***
	 * Create the frame. metodo abre tela para funcionario com um for para
	 * buscar a data do evento
	 */
	protected void abreTela(int status, Funcionario funcionario) {
		this.status = status;
		this.funcionario = funcionario;
		cliente.setId(2);
		lblCliente.setText("Cliente DeskTop");
		lblFuncionario.setText(funcionario.getNome());
		cbbEvento.addItem("");
		for (int i = 0; i < controleEvento.buscarData().size(); i++) {
			cbbEvento.addItem((controleEvento.buscarData().get(i)));
		}

	}

	/***
	 * Create the frame. metodo abre tela para cliente com um for para buscar a
	 * data do evento
	 */
	protected void abreTela(int status, Cliente cliente) {
		this.status = status;
		this.cliente = cliente;
		funcionario.setId(5);
		lblCliente.setText(cliente.getNome());
		lblFuncionario.setText("Venda Online");
		cbbEvento.addItem("");
		for (int i = 0; i < controleEvento.buscarData().size(); i++) {
			cbbEvento.addItem((controleEvento.buscarData().get(i)));
			System.out.println(i);
		}

	}
       
	public VenderIngresso() {
		setTitle("Vender Ingresso");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 586);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		JLabel lblBuscarCliente = new JLabel("Cliente");
		lblBuscarCliente.setBounds(24, 44, 94, 14);
		contentPane.add(lblBuscarCliente);

		/***
		 * txtCliente = new JTextField(); //txtCliente.setBounds(25, 107, 324,
		 * 20); //contentPane.add(txtCliente); //txtCliente.setColumns(10);
		 * 
		 */

		JLabel lblEvento = new JLabel("Evento");
		lblEvento.setBounds(24, 138, 46, 14);
		contentPane.add(lblEvento);

		/**
		 * combobox aonde sera escolhido o evento para compra/venda do ingresso,
		 * nele tera todas as informacoes, do evento como horario, data,
		 * localizacao do jogo, time x time e preco do ingresso.
		 */
		cbbEvento = new JComboBox();
		cbbEvento.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent arg0) {

				Object obj = cbbEvento.getSelectedItem();
				if (obj.getClass().equals(Evento.class)) {
					evento = new Evento();
					evento = (Evento) cbbEvento.getSelectedItem();
					SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
					lblData.setText(sdf.format(evento.getData()));
					lblEstadio.setText(evento.getEstadio().getNome());
					lblEstado.setText(evento.getEstadio().getLocalizacao()
							.getEstado());
					lblJogo.setText(evento.getTime_1().getNome() + " X "
							+ evento.getTime_2().getNome());

					ControleIngresso controleIngresso = new ControleIngresso();
					Ingresso ingresso = new Ingresso();
					ingresso.setEvento(evento);
					int vendidos;
					try {
						vendidos = controleIngresso.buscar(ingresso).size();
						maximo = evento.getEstadio().getCadeiraGeral()
								+ evento.getEstadio().getCadeirasCamarotes()
								- vendidos;
						cbbQuantidade.setModel(new SpinnerNumberModel(
								new Integer(0), new Integer(0), new Integer(
										maximo), new Integer(1)));
						lblCadeiras.setText(String.valueOf(maximo));
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				} else {
					lblData.setText("");
					lblEstadio.setText("");
					lblEstado.setText("");
					lblJogo.setText("");
					lblPreco.setText("");
					lblTotal.setText("");
					lblCadeiras.setText("");
				}

			}
		});
		cbbEvento.setBounds(22, 151, 358, 22);
		contentPane.add(cbbEvento);

		JLabel lblEstadiotexto = new JLabel("Estadio");
		lblEstadiotexto.setBounds(22, 210, 69, 14);
		contentPane.add(lblEstadiotexto);

		JLabel lblEstadoTexto = new JLabel("Estado");
		lblEstadoTexto.setBounds(390, 138, 46, 14);
		contentPane.add(lblEstadoTexto);

		lblEstadio = new JLabel("");
		lblEstadio.setBounds(22, 222, 201, 14);
		contentPane.add(lblEstadio);

		JLabel lblDatatexto = new JLabel("Data");
		lblDatatexto.setBounds(247, 210, 46, 14);
		contentPane.add(lblDatatexto);

		lblData = new JLabel("");
		lblData.setBounds(247, 222, 185, 14);
		contentPane.add(lblData);

		JLabel lblJogoTexto = new JLabel("Jogo");
		lblJogoTexto.setBounds(22, 283, 46, 14);
		contentPane.add(lblJogoTexto);

		lblJogo = new JLabel("");
		lblJogo.setBounds(22, 295, 201, 14);
		contentPane.add(lblJogo);

		JLabel lblTipoIngresso = new JLabel("Tipo Ingresso");
		lblTipoIngresso.setBounds(24, 352, 106, 14);
		contentPane.add(lblTipoIngresso);

		/**
		 * combobox para quantidade de ingresso sendo assim multiplicando pelo
		 * preco.
		 */
		cbbIngresso = new JComboBox();
		cbbIngresso.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent arg0) {
				if (cbbIngresso.getSelectedIndex() == 1) {
					lblPreco.setText(String.valueOf(evento.getPreco_geral()));
					lblTotal.setText(String.valueOf(evento.getPreco_geral()
							* (Integer) cbbQuantidade.getValue()));
					preco = evento.getPreco_geral()
							* (Integer) cbbQuantidade.getValue();
				} else if (cbbIngresso.getSelectedIndex() == 2) {
					lblPreco.setText(String.valueOf(evento.getPreco_camarote()));
					lblTotal.setText(String.valueOf(evento.getPreco_camarote()
							* (Integer) cbbQuantidade.getValue()));
					preco = evento.getPreco_camarote()
							* (Integer) cbbQuantidade.getValue();

				} else {
					lblPreco.setText("");
					lblTotal.setText("");
					preco = 0;
				}
			}
		});
		cbbIngresso.setModel(new DefaultComboBoxModel(new String[] { "",
				"Arquibancada", "Camarote" }));
		cbbIngresso.setBounds(22, 371, 170, 22);
		contentPane.add(cbbIngresso);

		JLabel lblPreoUnitarioTexto = new JLabel("Pre\u00E7o Unitario:");
		lblPreoUnitarioTexto.setBounds(22, 418, 94, 14);
		contentPane.add(lblPreoUnitarioTexto);

		lblPreco = new JLabel("");
		lblPreco.setBounds(163, 418, 106, 14);
		contentPane.add(lblPreco);

		JLabel lblQuantidade = new JLabel("Quantidade");
		lblQuantidade.setBounds(303, 397, 77, 14);
		contentPane.add(lblQuantidade);

		cbbQuantidade = new JSpinner();
		cbbQuantidade.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent arg0) {
				if (cbbIngresso.getSelectedIndex() == 1) {
					lblTotal.setText(String.valueOf(evento.getPreco_geral()
							* (Integer) cbbQuantidade.getValue()));
				} else if (cbbIngresso.getSelectedIndex() == 2) {
					lblTotal.setText(String.valueOf(evento.getPreco_camarote()
							* (Integer) cbbQuantidade.getValue()));
				} else {
					lblTotal.setText("");
				}
			}
		});
		cbbQuantidade.setModel(new SpinnerNumberModel(new Integer(0),
				new Integer(0), new Integer(maximo), new Integer(1)));
		cbbQuantidade.setBounds(303, 416, 62, 29);
		contentPane.add(cbbQuantidade);

		JLabel lblTotalTexto = new JLabel("Total:");
		lblTotalTexto.setBounds(22, 462, 46, 14);
		contentPane.add(lblTotalTexto);

		lblTotal = new JLabel("");
		lblTotal.setBounds(95, 462, 111, 14);
		contentPane.add(lblTotal);

		/***
		 * Metodo para comprar ingressos e salvar a venda do ingresso
		 * 
		 */
		JButton btnComprar = new JButton("Comprar");
		btnComprar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ControleVenda controleVenda = new ControleVenda();
				Venda venda = new Venda();
				venda.setCliente(cliente);
				venda.setFuncionario(funcionario);

				double fool = Double.valueOf(lblTotal.getText());
				if (fool != 0) {
					venda.setPreco(fool);
				}

				venda.setQuantidade((Integer) cbbQuantidade.getValue());
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				Date data = new Date();
				String dataFormatada = sdf.format(data);
				try {
					data = sdf.parse(dataFormatada);
				} catch (ParseException e1) {
					// TODO Auto-generated catch block
					// e1.printStackTrace();
				}
				venda.setData(data);
				try {
					controleVenda.salvar(venda);
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				try {
					venda = controleVenda.buscar(venda).get(0);
				} catch (Exception e3) {
					// TODO Auto-generated catch block
					// e3.printStackTrace();
				}
				for (int i = 0; i < venda.getQuantidade(); i++) {
					Ingresso ingresso = new Ingresso();
					ingresso.setEvento(evento);
					ingresso.setTipo(cbbIngresso.getSelectedIndex());
					ingresso.setVendido(true);

					try {
						controleIngresso.salvar(ingresso);
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						// e1.printStackTrace();
					}
					
				}

				List<Ingresso> ingressos = controleIngresso.buscarLimite(venda
						.getQuantidade());
				for (int i = 0; i < ingressos.size(); i++) {

					VendaIngresso vendaIngresso = new VendaIngresso();
					vendaIngresso.setIngresso(ingressos.get(i));
					vendaIngresso.setVenda(venda);
					try {
						controleVendaIngresso.salvar(vendaIngresso);
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

					try {
						venda.setVendaIngresso(controleVendaIngresso.buscar(vendaIngresso).get(0));
					} catch (Exception e2) {
						// TODO Auto-generated catch block
						e2.printStackTrace();
					}
					try {
						controleVenda.salvar(venda);
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

				}
				if (status == 1) {
					menuTela.abreTela(status, funcionario);
					menuTela.setVisible(true);
					dispose();

				} else if (status == 2) {

					menuTela.abreTela(status, cliente);
					menuTela.setVisible(true);
					dispose();

				}
			}
		});
		btnComprar.setBounds(65, 525, 91, 23);
		contentPane.add(btnComprar);

		/***
		 * Metodo para cancelar a operacao e sair
		 */
		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (status == 1) {
					menuTela.abreTela(status, funcionario);
					menuTela.setVisible(true);
					dispose();

				} else if (status == 2) {

					menuTela.abreTela(status, cliente);
					menuTela.setVisible(true);
					dispose();

				}

			}
		});
		btnCancelar.setBounds(247, 525, 91, 23);
		contentPane.add(btnCancelar);

		lblEstado = new JLabel("");
		lblEstado.setBounds(386, 155, 46, 14);
		contentPane.add(lblEstado);

		lblCliente = new JLabel("");
		lblCliente.setBounds(72, 44, 221, 14);
		contentPane.add(lblCliente);

		JLabel lblFuncionarioTexto = new JLabel("Funcionario");
		lblFuncionarioTexto.setBounds(24, 73, 94, 14);
		contentPane.add(lblFuncionarioTexto);

		lblFuncionario = new JLabel("");
		lblFuncionario.setBounds(128, 73, 210, 14);
		contentPane.add(lblFuncionario);

		JLabel lblTotal_1 = new JLabel("Total Restante");
		lblTotal_1.setBounds(247, 33, 101, 22);
		contentPane.add(lblTotal_1);

		lblCadeiras = new JLabel("");
		lblCadeiras.setBounds(360, 33, 73, 25);
		contentPane.add(lblCadeiras);
	}
}
